home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Synth / OscilGen.C < prev    next >
C/C++ Source or Header  |  2005-03-25  |  33KB  |  1,174 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   OscilGen.C - Waveform generator for ADnote
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <stdlib.h>
  24. #include <math.h>
  25. #include <stdio.h>
  26.  
  27. #include "OscilGen.h"
  28. #include "../Effects/Distorsion.h"
  29.  
  30. REALTYPE *OscilGen::tmpsmps;//this array stores some termporary data and it has SOUND_BUFFER_SIZE elements
  31. FFTFREQS OscilGen::outoscilFFTfreqs;
  32.  
  33.  
  34. OscilGen::OscilGen(FFTwrapper *fft_,Resonance *res_):Presets(){
  35.     setpresettype("Poscilgen");
  36.     fft=fft_;
  37.     res=res_;
  38.     newFFTFREQS(&oscilFFTfreqs,OSCIL_SIZE/2);
  39.     newFFTFREQS(&basefuncFFTfreqs,OSCIL_SIZE/2);
  40.  
  41.     randseed=1;
  42.     ADvsPAD=false;
  43.  
  44.     defaults();
  45. };
  46.  
  47. OscilGen::~OscilGen(){
  48.     deleteFFTFREQS(&basefuncFFTfreqs);
  49.     deleteFFTFREQS(&oscilFFTfreqs);
  50. };
  51.  
  52.  
  53. void OscilGen::defaults(){
  54.  
  55.     oldbasefunc=0;oldbasepar=64;oldhmagtype=0;oldwaveshapingfunction=0;oldwaveshaping=64;
  56.     oldbasefuncmodulation=0;oldharmonicshift=0;oldbasefuncmodulationpar1=0;oldbasefuncmodulationpar2=0;oldbasefuncmodulationpar3=0;
  57.     oldmodulation=0;oldmodulationpar1=0;oldmodulationpar2=0;oldmodulationpar3=0;
  58.  
  59.     for (int i=0;i<MAX_AD_HARMONICS;i++){
  60.     hmag[i]=0.0;
  61.     hphase[i]=0.0;
  62.     Phmag[i]=64;
  63.     Phphase[i]=64;
  64.     };
  65.     Phmag[0]=127;
  66.     Phmagtype=0;
  67.     if (ADvsPAD) Prand=127;//max phase randomness (usefull if the oscil will be imported to a ADsynth from a PADsynth
  68.     else Prand=64;//no randomness
  69.  
  70.     Pcurrentbasefunc=0;
  71.     Pbasefuncpar=64;
  72.  
  73.     Pbasefuncmodulation=0;
  74.     Pbasefuncmodulationpar1=64;
  75.     Pbasefuncmodulationpar2=64;
  76.     Pbasefuncmodulationpar3=32;
  77.  
  78.     Pmodulation=0;
  79.     Pmodulationpar1=64;
  80.     Pmodulationpar2=64;
  81.     Pmodulationpar3=32;
  82.  
  83.     Pwaveshapingfunction=0;
  84.     Pwaveshaping=64;
  85.     Pfiltertype=0;
  86.     Pfilterpar1=64;
  87.     Pfilterpar2=64;
  88.     Pfilterbeforews=0;
  89.     Psatype=0;
  90.     Psapar=64;
  91.  
  92.     Pamprandpower=64;
  93.     Pamprandtype=0;
  94.     
  95.     Pharmonicshift=0;
  96.     Pharmonicshiftfirst=0;
  97.  
  98.     Padaptiveharmonics=0;
  99.     Padaptiveharmonicspower=100;
  100.     Padaptiveharmonicsbasefreq=128;
  101.     Padaptiveharmonicspar=50;
  102.     
  103.     for (int i=0;i<OSCIL_SIZE/2;i++) {
  104.     oscilFFTfreqs.s[i]=0.0;
  105.     oscilFFTfreqs.c[i]=0.0;
  106.     basefuncFFTfreqs.s[i]=0.0;
  107.     basefuncFFTfreqs.c[i]=0.0;
  108.     };
  109.     oscilprepared=0;
  110.     oldfilterpars=0;oldsapars=0;
  111.     prepare();
  112. };
  113.  
  114. void OscilGen::convert2sine(int magtype){
  115.    REALTYPE mag[MAX_AD_HARMONICS],phase[MAX_AD_HARMONICS];
  116.     REALTYPE oscil[OSCIL_SIZE];
  117.     FFTFREQS freqs;
  118.     newFFTFREQS(&freqs,OSCIL_SIZE/2);
  119.  
  120.     get(oscil,-1.0);
  121.     FFTwrapper *fft=new FFTwrapper(OSCIL_SIZE);
  122.     fft->smps2freqs(oscil,freqs);
  123.     delete(fft);
  124.  
  125.     REALTYPE max=0.0;
  126.         
  127.     mag[0]=0;
  128.     phase[0]=0;
  129.     for (int i=0;i<MAX_AD_HARMONICS;i++){
  130.         mag[i]=sqrt(pow(freqs.s[i+1],2)+pow(freqs.c[i+1],2.0));
  131.     phase[i]=atan2(freqs.c[i+1],freqs.s[i+1]);
  132.     if (max<mag[i]) max=mag[i];
  133.     };
  134.     if (max<0.00001) max=1.0;
  135.     
  136.     defaults();
  137.         
  138.     for (int i=0;i<MAX_AD_HARMONICS-1;i++){
  139.     REALTYPE newmag=mag[i]/max;
  140.     REALTYPE newphase=phase[i];
  141.  
  142.     Phmag[i]=(int) ((newmag)*64.0)+64;
  143.     
  144.     Phphase[i]=64-(int) (64.0*newphase/PI);
  145.     if (Phphase[i]>127) Phphase[i]=127;
  146.     
  147.     if (Phmag[i]==64) Phphase[i]=64;
  148.     };
  149.     deleteFFTFREQS(&freqs);
  150.     prepare();
  151. };
  152.  
  153. /* 
  154.  * Base Functions - START 
  155.  */
  156. REALTYPE OscilGen::basefunc_pulse(REALTYPE x,REALTYPE a){
  157.     return((fmod(x,1.0)<a)?-1.0:1.0);
  158. };
  159.  
  160. REALTYPE OscilGen::basefunc_saw(REALTYPE x,REALTYPE a){
  161.     if (a<0.00001) a=0.00001;
  162.     else if (a>0.99999) a=0.99999;
  163.     x=fmod(x,1);
  164.     if (x<a) return(x/a*2.0-1.0);
  165.     else return((1.0-x)/(1.0-a)*2.0-1.0);
  166. };
  167.  
  168. REALTYPE OscilGen::basefunc_triangle(REALTYPE x,REALTYPE a){
  169.     x=fmod(x+0.25,1);
  170.     a=1-a;
  171.     if (a<0.00001) a=0.00001;
  172.     if (x<0.5) x=x*4-1.0;
  173.     else x=(1.0-x)*4-1.0;
  174.     x/=-a;
  175.     if (x<-1.0) x=-1.0;
  176.     if (x>1.0) x=1.0;
  177.     return(x);
  178. };
  179.  
  180. REALTYPE OscilGen::basefunc_power(REALTYPE x,REALTYPE a){
  181.     x=fmod(x,1);
  182.     if (a<0.00001) a=0.00001;
  183.     else if (a>0.99999) a=0.99999;
  184.     return(pow(x,exp((a-0.5)*10.0))*2.0-1.0);
  185. };
  186.  
  187. REALTYPE OscilGen::basefunc_gauss(REALTYPE x,REALTYPE a){
  188.     x=fmod(x,1)*2.0-1.0;
  189.     if (a<0.00001) a=0.00001;
  190.     return(exp(-x*x*(exp(a*8)+5.0))*2.0-1.0);
  191. };
  192.  
  193. REALTYPE OscilGen::basefunc_diode(REALTYPE x,REALTYPE a){
  194.     if (a<0.00001) a=0.00001;
  195.     else if (a>0.99999) a=0.99999;
  196.     a=a*2.0-1.0;
  197.     x=cos((x+0.5)*2.0*PI)-a;
  198.     if (x<0.0) x=0.0;
  199.     return(x/(1.0-a)*2-1.0);
  200. };
  201.  
  202. REALTYPE OscilGen::basefunc_abssine(REALTYPE x,REALTYPE a){
  203.     x=fmod(x,1);
  204.     if (a<0.00001) a=0.00001;
  205.     else if (a>0.99999) a=0.99999;
  206.     return(sin(pow(x,exp((a-0.5)*5.0))*PI)*2.0-1.0);
  207. };
  208.  
  209. REALTYPE OscilGen::basefunc_pulsesine(REALTYPE x,REALTYPE a){
  210.     if (a<0.00001) a=0.00001;
  211.     x=(fmod(x,1)-0.5)*exp((a-0.5)*log(128));
  212.     if (x<-0.5) x=-0.5;
  213.     else if (x>0.5) x=0.5;
  214.     x=sin(x*PI*2.0);
  215.     return(x);
  216. };
  217.  
  218. REALTYPE OscilGen::basefunc_stretchsine(REALTYPE x,REALTYPE a){
  219.     x=fmod(x+0.5,1)*2.0-1.0;
  220.     a=(a-0.5)*4;if (a>0.0) a*=2;
  221.     a=pow(3.0,a);
  222.     REALTYPE b=pow(fabs(x),a);
  223.     if (x<0) b=-b;
  224.     return(-sin(b*PI));
  225. };
  226.  
  227. REALTYPE OscilGen::basefunc_chirp(REALTYPE x,REALTYPE a){
  228.     x=fmod(x,1.0)*2.0*PI;
  229.     a=(a-0.5)*4;if (a<0.0) a*=2.0;
  230.     a=pow(3.0,a);
  231.     return(sin(x/2.0)*sin(a*x*x));
  232. };
  233.  
  234. REALTYPE OscilGen::basefunc_absstretchsine(REALTYPE x,REALTYPE a){
  235.     x=fmod(x+0.5,1)*2.0-1.0;
  236.     a=(a-0.5)*9;
  237.     a=pow(3.0,a);
  238.     REALTYPE b=pow(fabs(x),a);
  239.     if (x<0) b=-b;
  240.     return(-pow(sin(b*PI),2));
  241. };
  242.  
  243. REALTYPE OscilGen::basefunc_chebyshev(REALTYPE x,REALTYPE a){
  244.     a=a*a*a*30.0+1.0;
  245.     return(cos(acos(x*2.0-1.0)*a));
  246. };
  247.  
  248. REALTYPE OscilGen::basefunc_sqr(REALTYPE x,REALTYPE a){
  249.     a=a*a*a*a*160.0+0.001;
  250.     return(-atan(sin(x*2.0*PI)*a));
  251. };
  252. /* 
  253.  * Base Functions - END
  254.  */
  255.  
  256.  
  257. /* 
  258.  * Get the base function
  259.  */
  260. void OscilGen::getbasefunction(REALTYPE *smps){
  261.     int i;    
  262.     REALTYPE par=(Pbasefuncpar+0.5)/128.0;
  263.     if (Pbasefuncpar==64) par=0.5;
  264.     
  265.     REALTYPE basefuncmodulationpar1=Pbasefuncmodulationpar1/127.0,
  266.          basefuncmodulationpar2=Pbasefuncmodulationpar2/127.0,
  267.          basefuncmodulationpar3=Pbasefuncmodulationpar3/127.0;
  268.  
  269.     switch(Pbasefuncmodulation){
  270.         case 1:basefuncmodulationpar1=(pow(2,basefuncmodulationpar1*5.0)-1.0)/10.0;
  271.            basefuncmodulationpar3=floor((pow(2,basefuncmodulationpar3*5.0)-1.0));
  272.            if (basefuncmodulationpar3<0.9999) basefuncmodulationpar3=-1.0;
  273.         break;
  274.         case 2:basefuncmodulationpar1=(pow(2,basefuncmodulationpar1*5.0)-1.0)/10.0;
  275.            basefuncmodulationpar3=1.0+floor((pow(2,basefuncmodulationpar3*5.0)-1.0));
  276.             break;
  277.     case 3:basefuncmodulationpar1=(pow(2,basefuncmodulationpar1*7.0)-1.0)/10.0;
  278.            basefuncmodulationpar3=0.01+(pow(2,basefuncmodulationpar3*16.0)-1.0)/10.0;
  279.         break;
  280.     };    
  281.  
  282. //    printf("%.5f %.5f\n",basefuncmodulationpar1,basefuncmodulationpar3);
  283.  
  284.     for (i=0;i<OSCIL_SIZE;i++) {
  285.     REALTYPE t=i*1.0/OSCIL_SIZE;
  286.  
  287.     switch(Pbasefuncmodulation){
  288.         case 1:t=t*basefuncmodulationpar3+sin((t+basefuncmodulationpar2)*2.0*PI)*basefuncmodulationpar1;//rev
  289.         break;
  290.         case 2:t=t+sin((t*basefuncmodulationpar3+basefuncmodulationpar2)*2.0*PI)*basefuncmodulationpar1;//sine
  291.         break;
  292.         case 3:t=t+pow((1.0-cos((t+basefuncmodulationpar2)*2.0*PI))*0.5,basefuncmodulationpar3)*basefuncmodulationpar1;//power
  293.         break;
  294.     };
  295.     
  296.     t=t-floor(t);
  297.     
  298.     switch (Pcurrentbasefunc){
  299.             case 1:smps[i]=basefunc_triangle(t,par);
  300.             break;
  301.         case 2:smps[i]=basefunc_pulse(t,par);
  302.             break;
  303.         case 3:smps[i]=basefunc_saw(t,par);
  304.             break;
  305.         case 4:smps[i]=basefunc_power(t,par);
  306.             break;
  307.         case 5:smps[i]=basefunc_gauss(t,par);
  308.             break;
  309.         case 6:smps[i]=basefunc_diode(t,par);
  310.             break;
  311.         case 7:smps[i]=basefunc_abssine(t,par);
  312.             break;
  313.         case 8:smps[i]=basefunc_pulsesine(t,par);
  314.             break;
  315.         case 9:smps[i]=basefunc_stretchsine(t,par);
  316.            break;
  317.         case 10:smps[i]=basefunc_chirp(t,par);
  318.            break;
  319.         case 11:smps[i]=basefunc_absstretchsine(t,par);
  320.            break;
  321.         case 12:smps[i]=basefunc_chebyshev(t,par);
  322.            break;
  323.         case 13:smps[i]=basefunc_sqr(t,par);
  324.            break;
  325.         default:smps[i]=-sin(2.0*PI*i/OSCIL_SIZE);
  326.     };
  327.     };
  328. };
  329.  
  330. /* 
  331.  * Filter the oscillator
  332.  */
  333. void OscilGen::oscilfilter(){
  334.     if (Pfiltertype==0) return;
  335.     REALTYPE par=1.0-Pfilterpar1/128.0;
  336.     REALTYPE par2=Pfilterpar2/127.0;
  337.     REALTYPE max=0.0,tmp=0.0,p2,x;
  338.     for (int i=1;i<OSCIL_SIZE/2;i++){
  339.     REALTYPE gain=1.0;
  340.     switch(Pfiltertype){
  341.         case 1: gain=pow(1.0-par*par*par*0.99,i);//lp
  342.             tmp=par2*par2*par2*par2*0.5+0.0001;
  343.             if (gain<tmp) gain=pow(gain,10.0)/pow(tmp,9.0);
  344.             break;
  345.         case 2: gain=1.0-pow(1.0-par*par,i+1);//hp1
  346.             gain=pow(gain,par2*2.0+0.1);
  347.             break;
  348.         case 3: if (par<0.2) par=par*0.25+0.15;
  349.             gain=1.0-pow(1.0-par*par*0.999+0.001,i*0.05*i+1.0);//hp1b
  350.             tmp=pow(5.0,par2*2.0);
  351.             gain=pow(gain,tmp);
  352.             break;
  353.         case 4: gain=i+1-pow(2,(1.0-par)*7.5);//bp1
  354.             gain=1.0/(1.0+gain*gain/(i+1.0));
  355.             tmp=pow(5.0,par2*2.0);
  356.             gain=pow(gain,tmp);
  357.             if (gain<1e-5) gain=1e-5;
  358.             break;
  359.         case 5: gain=i+1-pow(2,(1.0-par)*7.5);//bs1
  360.             gain=pow(atan(gain/(i/10.0+1))/1.57,6);
  361.             gain=pow(gain,par2*par2*3.9+0.1);
  362.             break;
  363.         case 6: tmp=pow(par2,0.33);
  364.             gain=(i+1>pow(2,(1.0-par)*10)?0.0:1.0)*par2+(1.0-par2);//lp2
  365.             break;
  366.         case 7: tmp=pow(par2,0.33);
  367.             //tmp=1.0-(1.0-par2)*(1.0-par2);
  368.             gain=(i+1>pow(2,(1.0-par)*7)?1.0:0.0)*par2+(1.0-par2);//hp2
  369.             if (Pfilterpar1==0) gain=1.0;
  370.             break;
  371.         case 8: tmp=pow(par2,0.33);
  372.             //tmp=1.0-(1.0-par2)*(1.0-par2);
  373.                 gain=(fabs(pow(2,(1.0-par)*7)-i)>i/2+1?0.0:1.0)*par2+(1.0-par2);//bp2
  374.             break;
  375.         case 9: tmp=pow(par2,0.33);
  376.             gain=(fabs(pow(2,(1.0-par)*7)-i)<i/2+1?0.0:1.0)*par2+(1.0-par2);//bs2
  377.             break;
  378.         case 10:tmp=pow(5.0,par2*2.0-1.0);
  379.             tmp=pow(i/32.0,tmp)*32.0;
  380.             if (Pfilterpar2==64) tmp=i;
  381.             gain=cos(par*par*PI/2.0*tmp);//cos
  382.            gain*=gain;
  383.            break;
  384.         case 11:tmp=pow(5.0,par2*2.0-1.0);
  385.             tmp=pow(i/32.0,tmp)*32.0;
  386.             if (Pfilterpar2==64) tmp=i;
  387.             gain=sin(par*par*PI/2.0*tmp);//sin
  388.            gain*=gain;
  389.            break;
  390.         case 12:p2=1.0-par+0.2;
  391.             x=i/(64.0*p2*p2); 
  392.              if (x<0.0) x=0.0;
  393.                 else if (x>1.0) x=1.0;
  394.              tmp=pow(1.0-par2,2.0);
  395.              gain=cos(x*PI)*(1.0-tmp)+1.01+tmp;//low shelf
  396.             break;
  397.         case 13:tmp=(int) (pow(2.0,(1.0-par)*7.2));
  398.             gain=1.0;
  399.             if (i==(int) (tmp)) gain=pow(2.0,par2*par2*8.0);
  400.              break;
  401.     };
  402.     
  403.     
  404.     oscilFFTfreqs.s[i]*=gain;
  405.     oscilFFTfreqs.c[i]*=gain;
  406.     REALTYPE tmp=oscilFFTfreqs.s[i]*oscilFFTfreqs.s[i]+
  407.              oscilFFTfreqs.c[i]*oscilFFTfreqs.c[i];
  408.     if (max<tmp) max=tmp;
  409.     };
  410.  
  411.     max=sqrt(max);
  412.     if (max<1e-10) max=1.0;
  413.     REALTYPE imax=1.0/max;
  414.     for (int i=1;i<OSCIL_SIZE/2;i++) {
  415.     oscilFFTfreqs.s[i]*=imax; 
  416.     oscilFFTfreqs.c[i]*=imax; 
  417.     };
  418. };
  419.  
  420. /* 
  421.  * Change the base function
  422.  */
  423. void OscilGen::changebasefunction(){
  424.     if (Pcurrentbasefunc!=0) {
  425.         getbasefunction(tmpsmps);
  426.     fft->smps2freqs(tmpsmps,basefuncFFTfreqs);
  427.     basefuncFFTfreqs.c[0]=0.0;
  428.     } else {
  429.     for (int i=0;i<OSCIL_SIZE/2;i++){
  430.         basefuncFFTfreqs.s[i]=0.0;
  431.         basefuncFFTfreqs.c[i]=0.0;
  432.     };
  433.     //in this case basefuncFFTfreqs_ are not used
  434.     }
  435.     oscilprepared=0;
  436.     oldbasefunc=Pcurrentbasefunc;
  437.     oldbasepar=Pbasefuncpar;
  438.     oldbasefuncmodulation=Pbasefuncmodulation;
  439.     oldbasefuncmodulationpar1=Pbasefuncmodulationpar1;
  440.     oldbasefuncmodulationpar2=Pbasefuncmodulationpar2;
  441.     oldbasefuncmodulationpar3=Pbasefuncmodulationpar3;
  442. };
  443.  
  444. /* 
  445.  * Waveshape
  446.  */
  447. void OscilGen::waveshape(){
  448.     int i;
  449.  
  450.     oldwaveshapingfunction=Pwaveshapingfunction;
  451.     oldwaveshaping=Pwaveshaping;
  452.     if (Pwaveshapingfunction==0) return;
  453.  
  454.     oscilFFTfreqs.c[0]=0.0;//remove the DC
  455.     //reduce the amplitude of the freqs near the nyquist
  456.     for (i=1;i<OSCIL_SIZE/8;i++) {
  457.     REALTYPE tmp=i/(OSCIL_SIZE/8.0);
  458.     oscilFFTfreqs.s[OSCIL_SIZE/2-i]*=tmp;
  459.     oscilFFTfreqs.c[OSCIL_SIZE/2-i]*=tmp;
  460.     };
  461.     fft->freqs2smps(oscilFFTfreqs,tmpsmps); 
  462.  
  463.     //Normalize
  464.     REALTYPE max=0.0;
  465.     for (i=0;i<OSCIL_SIZE;i++) 
  466.     if (max<fabs(tmpsmps[i])) max=fabs(tmpsmps[i]);
  467.     if (max<0.00001) max=1.0;
  468.     max=1.0/max;for (i=0;i<OSCIL_SIZE;i++) tmpsmps[i]*=max;
  469.     
  470.     //Do the waveshaping
  471.     waveshapesmps(OSCIL_SIZE,tmpsmps,Pwaveshapingfunction,Pwaveshaping);
  472.     
  473.     fft->smps2freqs(tmpsmps,oscilFFTfreqs);//perform FFT
  474. };
  475.  
  476.  
  477. /* 
  478.  * Do the Frequency Modulation of the Oscil
  479.  */
  480. void OscilGen::modulation(){
  481.     int i;
  482.  
  483.     oldmodulation=Pmodulation;
  484.     oldmodulationpar1=Pmodulationpar1;
  485.     oldmodulationpar2=Pmodulationpar2;
  486.     oldmodulationpar3=Pmodulationpar3;
  487.     if (Pmodulation==0) return;
  488.  
  489.  
  490.     REALTYPE modulationpar1=Pmodulationpar1/127.0,
  491.          modulationpar2=0.5-Pmodulationpar2/127.0,
  492.          modulationpar3=Pmodulationpar3/127.0;
  493.  
  494.     switch(Pmodulation){
  495.         case 1:modulationpar1=(pow(2,modulationpar1*7.0)-1.0)/100.0;
  496.            modulationpar3=floor((pow(2,modulationpar3*5.0)-1.0));
  497.            if (modulationpar3<0.9999) modulationpar3=-1.0;
  498.         break;
  499.         case 2:modulationpar1=(pow(2,modulationpar1*7.0)-1.0)/100.0;
  500.            modulationpar3=1.0+floor((pow(2,modulationpar3*5.0)-1.0));
  501.             break;
  502.     case 3:modulationpar1=(pow(2,modulationpar1*9.0)-1.0)/100.0;
  503.            modulationpar3=0.01+(pow(2,modulationpar3*16.0)-1.0)/10.0;
  504.         break;
  505.     };    
  506.  
  507.     oscilFFTfreqs.c[0]=0.0;//remove the DC
  508.     //reduce the amplitude of the freqs near the nyquist
  509.     for (i=1;i<OSCIL_SIZE/8;i++) {
  510.     REALTYPE tmp=i/(OSCIL_SIZE/8.0);
  511.     oscilFFTfreqs.s[OSCIL_SIZE/2-i]*=tmp;
  512.     oscilFFTfreqs.c[OSCIL_SIZE/2-i]*=tmp;
  513.     };
  514.     fft->freqs2smps(oscilFFTfreqs,tmpsmps);
  515.     int extra_points=2;
  516.     REALTYPE *in=new REALTYPE[OSCIL_SIZE+extra_points];
  517.  
  518.     //Normalize
  519.     REALTYPE max=0.0;
  520.     for (i=0;i<OSCIL_SIZE;i++) if (max<fabs(tmpsmps[i])) max=fabs(tmpsmps[i]);
  521.     if (max<0.00001) max=1.0;
  522.     max=1.0/max;for (i=0;i<OSCIL_SIZE;i++) in[i]=tmpsmps[i]*max;
  523.     for (i=0;i<extra_points;i++) in[i+OSCIL_SIZE]=tmpsmps[i]*max;
  524.     
  525.     //Do the modulation
  526.     for (i=0;i<OSCIL_SIZE;i++) {
  527.     REALTYPE t=i*1.0/OSCIL_SIZE;
  528.  
  529.     switch(Pmodulation){
  530.         case 1:t=t*modulationpar3+sin((t+modulationpar2)*2.0*PI)*modulationpar1;//rev
  531.         break;
  532.         case 2:t=t+sin((t*modulationpar3+modulationpar2)*2.0*PI)*modulationpar1;//sine
  533.         break;
  534.         case 3:t=t+pow((1.0-cos((t+modulationpar2)*2.0*PI))*0.5,modulationpar3)*modulationpar1;//power
  535.         break;
  536.     };
  537.     
  538.     t=(t-floor(t))*OSCIL_SIZE;
  539.     
  540.     int poshi=(int) t;
  541.     REALTYPE poslo=t-floor(t);
  542.  
  543.     tmpsmps[i]=in[poshi]*(1.0-poslo)+in[poshi+1]*poslo;
  544.     };
  545.  
  546.     delete(in);
  547.     fft->smps2freqs(tmpsmps,oscilFFTfreqs);//perform FFT
  548. };
  549.  
  550.  
  551.  
  552. /* 
  553.  * Adjust the spectrum
  554.  */
  555. void OscilGen::spectrumadjust(){
  556.     if (Psatype==0) return;
  557.     REALTYPE par=Psapar/127.0;
  558.     switch(Psatype){
  559.     case 1: par=1.0-par*2.0;
  560.         if (par>=0.0) par=pow(5.0,par);
  561.             else par=pow(8.0,par);
  562.         break;
  563.     case 2: par=pow(10.0,(1.0-par)*3.0)*0.25;
  564.         break;
  565.     case 3: par=pow(10.0,(1.0-par)*3.0)*0.25;
  566.         break;
  567.     };
  568.  
  569.  
  570.     REALTYPE max=0.0;
  571.     for (int i=0;i<OSCIL_SIZE/2;i++){ 
  572.     REALTYPE tmp=pow(oscilFFTfreqs.c[i],2)+pow(oscilFFTfreqs.s[i],2.0);
  573.     if (max<tmp) max=tmp;
  574.     };
  575.     max=sqrt(max)/OSCIL_SIZE*2.0;
  576.     if (max<1e-8) max=1.0;
  577.  
  578.     
  579.     for (int i=0;i<OSCIL_SIZE/2;i++){
  580.         REALTYPE mag=sqrt(pow(oscilFFTfreqs.s[i],2)+pow(oscilFFTfreqs.c[i],2.0))/max;
  581.     REALTYPE phase=atan2(oscilFFTfreqs.s[i],oscilFFTfreqs.c[i]);
  582.     
  583.     switch (Psatype){
  584.         case 1: mag=pow(mag,par);
  585.             break;
  586.         case 2: if (mag<par) mag=0.0;
  587.             break;
  588.         case 3: mag/=par;
  589.             if (mag>1.0) mag=1.0;
  590.             break;
  591.     };
  592.     oscilFFTfreqs.c[i]=mag*cos(phase);
  593.     oscilFFTfreqs.s[i]=mag*sin(phase);
  594.     };
  595.     
  596. };
  597.  
  598. void OscilGen::shiftharmonics(){
  599.     if (Pharmonicshift==0) return;
  600.     
  601.     REALTYPE hc,hs;
  602.     int harmonicshift=-Pharmonicshift;
  603.     
  604.     if (harmonicshift>0){
  605.     for (int i=OSCIL_SIZE/2-2;i>=0;i--){ 
  606.         int oldh=i-harmonicshift;
  607.         if (oldh<0){
  608.         hc=0.0;
  609.         hs=0.0;
  610.         } else {
  611.         hc=oscilFFTfreqs.c[oldh+1];
  612.         hs=oscilFFTfreqs.s[oldh+1];
  613.         };
  614.         oscilFFTfreqs.c[i+1]=hc;
  615.         oscilFFTfreqs.s[i+1]=hs;
  616.     };
  617.     } else {
  618.     for (int i=0;i<OSCIL_SIZE/2-1;i++){ 
  619.         int oldh=i+abs(harmonicshift);
  620.         if (oldh>=(OSCIL_SIZE/2-1)){
  621.         hc=0.0;
  622.         hs=0.0;
  623.         } else {
  624.         hc=oscilFFTfreqs.c[oldh+1];
  625.         hs=oscilFFTfreqs.s[oldh+1];
  626.         if (fabs(hc)<0.000001) hc=0.0;
  627.         if (fabs(hs)<0.000001) hs=0.0;
  628.         };
  629.         
  630.         oscilFFTfreqs.c[i+1]=hc;
  631.         oscilFFTfreqs.s[i+1]=hs;
  632.     };
  633.     };
  634.     
  635.     oscilFFTfreqs.c[0]=0.0;
  636. };
  637.  
  638. /* 
  639.  * Prepare the Oscillator
  640.  */
  641. void OscilGen::prepare(){
  642.    int i,j,k;
  643.    REALTYPE a,b,c,d,hmagnew;
  644.   
  645.    if ((oldbasepar!=Pbasefuncpar)||(oldbasefunc!=Pcurrentbasefunc)||
  646.     (oldbasefuncmodulation!=Pbasefuncmodulation)||
  647.         (oldbasefuncmodulationpar1!=Pbasefuncmodulationpar1)||
  648.     (oldbasefuncmodulationpar2!=Pbasefuncmodulationpar2)||
  649.     (oldbasefuncmodulationpar3!=Pbasefuncmodulationpar3)) 
  650.      changebasefunction();
  651.  
  652.    for (i=0;i<MAX_AD_HARMONICS;i++) hphase[i]=(Phphase[i]-64.0)/64.0*PI/(i+1);
  653.  
  654.    for (i=0;i<MAX_AD_HARMONICS;i++){
  655.       hmagnew=1.0-fabs(Phmag[i]/64.0-1.0);
  656.       switch(Phmagtype){
  657.     case 1:hmag[i]=exp(hmagnew*log(0.01)); break;
  658.     case 2:hmag[i]=exp(hmagnew*log(0.001));break;
  659.     case 3:hmag[i]=exp(hmagnew*log(0.0001));break;
  660.     case 4:hmag[i]=exp(hmagnew*log(0.00001));break;
  661.     default:hmag[i]=1.0-hmagnew;
  662.             break; 
  663.       };
  664.  
  665.       if (Phmag[i]<64) hmag[i]=-hmag[i];
  666.    };
  667.     
  668.    //remove the harmonics where Phmag[i]==64
  669.    for (i=0;i<MAX_AD_HARMONICS;i++) if (Phmag[i]==64) hmag[i]=0.0;
  670.  
  671.  
  672.    for (i=0;i<OSCIL_SIZE/2;i++) {
  673.       oscilFFTfreqs.c[i]=0.0;
  674.       oscilFFTfreqs.s[i]=0.0;
  675.    };
  676.    if (Pcurrentbasefunc==0) {//the sine case
  677.     for (i=0;i<MAX_AD_HARMONICS;i++){
  678.         oscilFFTfreqs.c[i+1]=-hmag[i]*sin(hphase[i]*(i+1))/2.0;
  679.         oscilFFTfreqs.s[i+1]=hmag[i]*cos(hphase[i]*(i+1))/2.0;
  680.     };
  681.    } else {
  682.     for (j=0;j<MAX_AD_HARMONICS;j++){
  683.         if (Phmag[j]==64) continue;
  684.         for (i=1;i<OSCIL_SIZE/2;i++){
  685.         k=i*(j+1);if (k>=OSCIL_SIZE/2) break;
  686.         a=basefuncFFTfreqs.c[i];
  687.         b=basefuncFFTfreqs.s[i];
  688.         c=hmag[j]*cos(hphase[j]*k);
  689.         d=hmag[j]*sin(hphase[j]*k);
  690.         oscilFFTfreqs.c[k]+=a*c-b*d;
  691.         oscilFFTfreqs.s[k]+=a*d+b*c;
  692.         };
  693.     };
  694.  
  695.    };
  696.  
  697.    if (Pharmonicshiftfirst!=0)  shiftharmonics();
  698.  
  699.  
  700.  
  701.    if (Pfilterbeforews==0){
  702.         waveshape();
  703.     oscilfilter();
  704.     } else {
  705.     oscilfilter();
  706.         waveshape();
  707.     };
  708.  
  709.    modulation();
  710.    spectrumadjust();
  711.    if (Pharmonicshiftfirst==0)  shiftharmonics();
  712.  
  713.    oscilFFTfreqs.c[0]=0.0;
  714.  
  715.    oldhmagtype=Phmagtype;
  716.    oldharmonicshift=Pharmonicshift+Pharmonicshiftfirst*256;
  717.  
  718.    oscilprepared=1;
  719. };
  720.  
  721. void OscilGen::adaptiveharmonic(FFTFREQS f,REALTYPE freq){
  722.     if ((Padaptiveharmonics==0)||(freq<1.0)) return;
  723.  
  724.     FFTFREQS inf;
  725.     newFFTFREQS(&inf,OSCIL_SIZE/2);
  726.     for (int i=0;i<OSCIL_SIZE/2;i++) {
  727.     inf.s[i]=f.s[i];
  728.     inf.c[i]=f.c[i];
  729.     f.s[i]=0.0;
  730.     f.c[i]=0.0;
  731.     };
  732.     inf.c[0]=0.0;inf.s[0]=0.0;    
  733.     
  734.     REALTYPE hc=0.0,hs=0.0;
  735.     REALTYPE basefreq=30.0*pow(10.0,Padaptiveharmonicsbasefreq/128.0);
  736.     REALTYPE power=(Padaptiveharmonicspower+1.0)/101.0;
  737.     
  738.     REALTYPE rap=freq/basefreq;
  739.  
  740.     rap=pow(rap,power);
  741.  
  742.     bool down=false;
  743.     if (rap>1.0) {
  744.     rap=1.0/rap;
  745.     down=true;
  746.     };
  747.     
  748.     for (int i=0;i<OSCIL_SIZE/2-2;i++){ 
  749.     REALTYPE h=i*rap;
  750.         int high=(int)(i*rap);
  751.     REALTYPE low=fmod(h,1.0);
  752.  
  753.         if (high>=(OSCIL_SIZE/2-2)){
  754.         break;
  755.     } else {
  756.         if (down){
  757.         f.c[high]+=inf.c[i]*(1.0-low);
  758.         f.s[high]+=inf.s[i]*(1.0-low);
  759.         f.c[high+1]+=inf.c[i]*low;
  760.         f.s[high+1]+=inf.s[i]*low;
  761.         } else {
  762.         hc=inf.c[high]*(1.0-low)+inf.c[high+1]*low;
  763.         hs=inf.s[high]*(1.0-low)+inf.s[high+1]*low;
  764.         };
  765.         if (fabs(hc)<0.000001) hc=0.0;
  766.         if (fabs(hs)<0.000001) hs=0.0;
  767.     };
  768.     
  769.     if (!down){    
  770.         if (i==0) {//corect the aplitude of the first harmonic
  771.         hc*=rap;
  772.         hs*=rap;
  773.         };
  774.         f.c[i]=hc;
  775.         f.s[i]=hs;
  776.     };
  777.     };
  778.     
  779.     f.c[1]+=f.c[0];f.s[1]+=f.s[0];
  780.     f.c[0]=0.0;f.s[0]=0.0;    
  781.     deleteFFTFREQS(&inf);
  782. };
  783.  
  784. void OscilGen::adaptiveharmonicpostprocess(REALTYPE *f,int size){
  785.     if (Padaptiveharmonics<=1) return;
  786.     REALTYPE *inf=new REALTYPE[size];
  787.     REALTYPE par=Padaptiveharmonicspar*0.01;
  788.     par=1.0-pow((1.0-par),1.5);
  789.     
  790.     for (int i=0;i<size;i++) {
  791.     inf[i]=f[i]*par;
  792.     f[i]=f[i]*(1.0-par);
  793.     };
  794.  
  795.     
  796.     if (Padaptiveharmonics==2){//2n+1
  797.         for (int i=0;i<size;i++) if ((i%2)==0) f[i]+=inf[i];//i=0 pt prima armonica,etc.
  798.     } else{//celelalte moduri
  799.         int nh=(Padaptiveharmonics-3)/2+2;
  800.         int sub_vs_add=(Padaptiveharmonics-3)%2;
  801.     if (sub_vs_add==0){
  802.             for (int i=0;i<size;i++) {
  803.         if (((i+1)%nh)==0){
  804.             f[i]+=inf[i];
  805.         };
  806.         };
  807.         } else {
  808.             for (int i=0;i<size/nh-1;i++) {
  809.         f[(i+1)*nh-1]+=inf[i];
  810.         };
  811.     };
  812.     };
  813.  
  814.     delete(inf);
  815. };
  816.  
  817.  
  818.  
  819. /* 
  820.  * Get the oscillator function
  821.  */
  822. short int OscilGen::get(REALTYPE *smps,REALTYPE freqHz){
  823.     return(this->get(smps,freqHz,0));
  824. };
  825.  
  826. void OscilGen::newrandseed(unsigned int randseed){
  827.     this->randseed=randseed;
  828. };
  829.  
  830. /* 
  831.  * Get the oscillator function
  832.  */
  833. short int OscilGen::get(REALTYPE *smps,REALTYPE freqHz,int resonance){
  834.     int i;
  835.     int nyquist,outpos;
  836.     
  837.     if ((oldbasepar!=Pbasefuncpar)||(oldbasefunc!=Pcurrentbasefunc)||(oldhmagtype!=Phmagtype)
  838.     ||(oldwaveshaping!=Pwaveshaping)||(oldwaveshapingfunction!=Pwaveshapingfunction)) oscilprepared=0;
  839.     if (oldfilterpars!=Pfiltertype*256+Pfilterpar1+Pfilterpar2*65536+Pfilterbeforews*16777216){ 
  840.     oscilprepared=0;
  841.     oldfilterpars=Pfiltertype*256+Pfilterpar1+Pfilterpar2*65536+Pfilterbeforews*16777216;
  842.     };
  843.     if (oldsapars!=Psatype*256+Psapar){ 
  844.     oscilprepared=0;
  845.     oldsapars=Psatype*256+Psapar;
  846.     };
  847.  
  848.     if ((oldbasefuncmodulation!=Pbasefuncmodulation)||
  849.         (oldbasefuncmodulationpar1!=Pbasefuncmodulationpar1)||
  850.     (oldbasefuncmodulationpar2!=Pbasefuncmodulationpar2)||
  851.     (oldbasefuncmodulationpar3!=Pbasefuncmodulationpar3)) 
  852.         oscilprepared=0;
  853.  
  854.     if ((oldmodulation!=Pmodulation)||
  855.         (oldmodulationpar1!=Pmodulationpar1)||
  856.     (oldmodulationpar2!=Pmodulationpar2)||
  857.     (oldmodulationpar3!=Pmodulationpar3)) 
  858.         oscilprepared=0;
  859.  
  860.     if (oldharmonicshift!=Pharmonicshift+Pharmonicshiftfirst*256) oscilprepared=0;
  861.     
  862.     if (oscilprepared!=1) prepare();
  863.  
  864.     outpos=(int)((RND*2.0-1.0)*(REALTYPE) OSCIL_SIZE*(Prand-64.0)/64.0);
  865.     outpos=(outpos+2*OSCIL_SIZE) % OSCIL_SIZE;
  866.  
  867.  
  868.     for (i=0;i<OSCIL_SIZE/2;i++){
  869.     outoscilFFTfreqs.c[i]=0.0;
  870.     outoscilFFTfreqs.s[i]=0.0;
  871.     };
  872.  
  873.     nyquist=(int)(0.5*SAMPLE_RATE/fabs(freqHz))+2;
  874.     if (ADvsPAD) nyquist=(int)(OSCIL_SIZE/2);
  875.     if (nyquist>OSCIL_SIZE/2) nyquist=OSCIL_SIZE/2;
  876.     
  877.     
  878.     int realnyquist=nyquist;
  879.     
  880.     if (Padaptiveharmonics!=0) nyquist=OSCIL_SIZE/2;
  881.     for (i=1;i<nyquist-1;i++) {
  882.         outoscilFFTfreqs.c[i]=oscilFFTfreqs.c[i];
  883.         outoscilFFTfreqs.s[i]=oscilFFTfreqs.s[i];
  884.     };
  885.  
  886.     adaptiveharmonic(outoscilFFTfreqs,freqHz);
  887.     adaptiveharmonicpostprocess(&outoscilFFTfreqs.c[1],OSCIL_SIZE/2-1);
  888.     adaptiveharmonicpostprocess(&outoscilFFTfreqs.s[1],OSCIL_SIZE/2-1);
  889.  
  890.     nyquist=realnyquist;
  891.     if (Padaptiveharmonics){//do the antialiasing in the case of adaptive harmonics
  892.         for (i=nyquist;i<OSCIL_SIZE/2;i++) {
  893.         outoscilFFTfreqs.s[i]=0;
  894.         outoscilFFTfreqs.c[i]=0;
  895.     };
  896.     };
  897.  
  898.     // Randomness (each harmonic), the block type is computed 
  899.     // in ADnote by setting start position according to this setting
  900.     if ((Prand>64)&&(freqHz>=0.0)&&(!ADvsPAD)){
  901.         REALTYPE rnd,angle,a,b,c,d;
  902.         rnd=PI*pow((Prand-64.0)/64.0,2.0);
  903.         for (i=1;i<nyquist-1;i++){//to Nyquist only for AntiAliasing
  904.             angle=rnd*i*RND;
  905.         a=outoscilFFTfreqs.c[i];
  906.         b=outoscilFFTfreqs.s[i];
  907.         c=cos(angle);
  908.         d=sin(angle);
  909.         outoscilFFTfreqs.c[i]=a*c-b*d;
  910.         outoscilFFTfreqs.s[i]=a*d+b*c;
  911.     };    
  912.     };
  913.  
  914.     //Harmonic Amplitude Randomness
  915.     if ((freqHz>0.1)&&(!ADvsPAD)) {
  916.     unsigned int realrnd=rand();
  917.     srand(randseed);
  918.     REALTYPE power=Pamprandpower/127.0;
  919.     REALTYPE normalize=1.0/(1.2-power);
  920.     switch (Pamprandtype){
  921.         case 1: power=power*2.0-0.5;
  922.             power=pow(15.0,power);
  923.             for (i=1;i<nyquist-1;i++){
  924.                     REALTYPE amp=pow(RND,power)*normalize;
  925.             outoscilFFTfreqs.c[i]*=amp;
  926.             outoscilFFTfreqs.s[i]*=amp;
  927.             };
  928.             break;
  929.         case 2: power=power*2.0-0.5;
  930.             power=pow(15.0,power)*2.0;
  931.             REALTYPE rndfreq=2*PI*RND;
  932.             for (i=1;i<nyquist-1;i++){
  933.                     REALTYPE amp=pow(fabs(sin(i*rndfreq)),power)*normalize;
  934.             outoscilFFTfreqs.c[i]*=amp;
  935.             outoscilFFTfreqs.s[i]*=amp;
  936.             };
  937.             break;
  938.     };    
  939.     srand(realrnd+1);
  940.     };
  941.  
  942.     if ((freqHz>0.1)&&(resonance!=0)) res->applyres(nyquist-1,outoscilFFTfreqs,freqHz);
  943.  
  944.     //Full RMS normalize
  945.     REALTYPE sum=0;
  946.     for (int j=1;j<OSCIL_SIZE/2;j++) {
  947.         REALTYPE term=outoscilFFTfreqs.c[j]*outoscilFFTfreqs.c[j]
  948.         +outoscilFFTfreqs.s[j]*outoscilFFTfreqs.s[j];
  949.         sum+=term;
  950.     };
  951.     if (sum<0.000001) sum=1.0;    
  952.     sum=1.0/sqrt(sum);
  953.     for (int j=1;j<OSCIL_SIZE/2;j++) {
  954.     outoscilFFTfreqs.c[j]*=sum; 
  955.     outoscilFFTfreqs.s[j]*=sum; 
  956.     };
  957.    
  958.  
  959.     if ((ADvsPAD)&&(freqHz>0.1)){//in this case the smps will contain the freqs
  960.         for (i=1;i<OSCIL_SIZE/2;i++) smps[i-1]=sqrt(outoscilFFTfreqs.c[i]*outoscilFFTfreqs.c[i]
  961.         +outoscilFFTfreqs.s[i]*outoscilFFTfreqs.s[i]);
  962.     } else {
  963.     fft->freqs2smps(outoscilFFTfreqs,smps);
  964.         for (i=0;i<OSCIL_SIZE;i++) smps[i]*=0.25;//correct the amplitude
  965.     };
  966.  
  967.     if (Prand<64) return(outpos);
  968.     else return(0);
  969. };
  970.  
  971.  
  972. /* 
  973.  * Get the spectrum of the oscillator for the UI
  974.  */
  975. void OscilGen::getspectrum(int n, REALTYPE *spc,int what){
  976.     if (n>OSCIL_SIZE/2) n=OSCIL_SIZE/2;
  977.     for (int i=1;i<n;i++){
  978.     if (what==0){
  979.         spc[i-1]=sqrt(oscilFFTfreqs.c[i]*oscilFFTfreqs.c[i]
  980.                   +oscilFFTfreqs.s[i]*oscilFFTfreqs.s[i]);
  981.     } else {
  982.         if (Pcurrentbasefunc==0) spc[i-1]=((i==1)?(1.0):(0.0));
  983.         else spc[i-1]=sqrt(basefuncFFTfreqs.c[i]*basefuncFFTfreqs.c[i]+
  984.              basefuncFFTfreqs.s[i]*basefuncFFTfreqs.s[i]);
  985.     };
  986.     };
  987.     if (what==0) adaptiveharmonicpostprocess(spc,n-1);
  988. };
  989.  
  990.  
  991. /* 
  992.  * Convert the oscillator as base function
  993.  */
  994. void OscilGen::useasbase(){
  995.    int i;
  996.  
  997.    for (i=0;i<OSCIL_SIZE/2;i++) {
  998.        basefuncFFTfreqs.c[i]=oscilFFTfreqs.c[i];
  999.        basefuncFFTfreqs.s[i]=oscilFFTfreqs.s[i];
  1000.    };
  1001.  
  1002.    oldbasefunc=Pcurrentbasefunc=127;
  1003.  
  1004.    prepare();
  1005. };
  1006.  
  1007.  
  1008. /* 
  1009.  * Get the base function for UI
  1010.  */
  1011. void OscilGen::getcurrentbasefunction(REALTYPE *smps){
  1012.     if (Pcurrentbasefunc!=0) {
  1013.     fft->freqs2smps(basefuncFFTfreqs,smps);
  1014.     } else getbasefunction(smps);//the sine case
  1015. };
  1016.  
  1017.  
  1018. void OscilGen::add2XML(XMLwrapper *xml){
  1019.     xml->addpar("harmonic_mag_type",Phmagtype);
  1020.  
  1021.     xml->addpar("base_function",Pcurrentbasefunc);
  1022.     xml->addpar("base_function_par",Pbasefuncpar);
  1023.     xml->addpar("base_function_modulation",Pbasefuncmodulation);
  1024.     xml->addpar("base_function_modulation_par1",Pbasefuncmodulationpar1);
  1025.     xml->addpar("base_function_modulation_par2",Pbasefuncmodulationpar2);
  1026.     xml->addpar("base_function_modulation_par3",Pbasefuncmodulationpar3);
  1027.  
  1028.     xml->addpar("modulation",Pmodulation);
  1029.     xml->addpar("modulation_par1",Pmodulationpar1);
  1030.     xml->addpar("modulation_par2",Pmodulationpar2);
  1031.     xml->addpar("modulation_par3",Pmodulationpar3);
  1032.  
  1033.     xml->addpar("wave_shaping",Pwaveshaping);
  1034.     xml->addpar("wave_shaping_function",Pwaveshapingfunction);
  1035.  
  1036.     xml->addpar("filter_type",Pfiltertype);
  1037.     xml->addpar("filter_par1",Pfilterpar1);
  1038.     xml->addpar("filter_par2",Pfilterpar2);
  1039.     xml->addpar("filter_before_wave_shaping",Pfilterbeforews);
  1040.  
  1041.     xml->addpar("spectrum_adjust_type",Psatype);
  1042.     xml->addpar("spectrum_adjust_par",Psapar);
  1043.  
  1044.     xml->addpar("rand",Prand);
  1045.     xml->addpar("amp_rand_type",Pamprandtype);
  1046.     xml->addpar("amp_rand_power",Pamprandpower);
  1047.  
  1048.     xml->addpar("harmonic_shift",Pharmonicshift);
  1049.     xml->addparbool("harmonic_shift_first",Pharmonicshiftfirst);
  1050.  
  1051.     xml->addpar("adaptive_harmonics",Padaptiveharmonics);
  1052.     xml->addpar("adaptive_harmonics_base_frequency",Padaptiveharmonicsbasefreq);
  1053.     xml->addpar("adaptive_harmonics_power",Padaptiveharmonicspower);
  1054.  
  1055.     xml->beginbranch("HARMONICS");
  1056.     for (int n=0;n<MAX_AD_HARMONICS;n++){
  1057.         if ((Phmag[n]==64)&&(Phphase[n]==64)) continue;
  1058.         xml->beginbranch("HARMONIC",n+1);
  1059.         xml->addpar("mag",Phmag[n]);
  1060.         xml->addpar("phase",Phphase[n]);
  1061.         xml->endbranch();
  1062.     };
  1063.     xml->endbranch();
  1064.     
  1065.     if (Pcurrentbasefunc==127){
  1066.     REALTYPE max=0.0;
  1067.  
  1068.     for (int i=0;i<OSCIL_SIZE/2;i++){
  1069.         if (max<fabs(basefuncFFTfreqs.c[i])) max=fabs(basefuncFFTfreqs.c[i]);
  1070.         if (max<fabs(basefuncFFTfreqs.s[i])) max=fabs(basefuncFFTfreqs.s[i]);
  1071.     };
  1072.     if (max<0.00000001) max=1.0;
  1073.  
  1074.     xml->beginbranch("BASE_FUNCTION");
  1075.         for (int i=1;i<OSCIL_SIZE/2;i++){
  1076.         REALTYPE xc=basefuncFFTfreqs.c[i]/max;
  1077.             REALTYPE xs=basefuncFFTfreqs.s[i]/max;
  1078.         if ((fabs(xs)>0.00001)&&(fabs(xs)>0.00001)){
  1079.             xml->beginbranch("BF_HARMONIC",i);
  1080.             xml->addparreal("cos",xc);
  1081.             xml->addparreal("sin",xs);
  1082.             xml->endbranch();
  1083.         };
  1084.         };
  1085.     xml->endbranch();
  1086.     };
  1087. };
  1088.  
  1089.  
  1090. void OscilGen::getfromXML(XMLwrapper *xml){
  1091.  
  1092.     Phmagtype=xml->getpar127("harmonic_mag_type",Phmagtype);
  1093.  
  1094.     Pcurrentbasefunc=xml->getpar127("base_function",Pcurrentbasefunc);
  1095.     Pbasefuncpar=xml->getpar127("base_function_par",Pbasefuncpar);
  1096.  
  1097.     Pbasefuncmodulation=xml->getpar127("base_function_modulation",Pbasefuncmodulation);
  1098.     Pbasefuncmodulationpar1=xml->getpar127("base_function_modulation_par1",Pbasefuncmodulationpar1);
  1099.     Pbasefuncmodulationpar2=xml->getpar127("base_function_modulation_par2",Pbasefuncmodulationpar2);
  1100.     Pbasefuncmodulationpar3=xml->getpar127("base_function_modulation_par3",Pbasefuncmodulationpar3);
  1101.  
  1102.     Pmodulation=xml->getpar127("modulation",Pmodulation);
  1103.     Pmodulationpar1=xml->getpar127("modulation_par1",Pmodulationpar1);
  1104.     Pmodulationpar2=xml->getpar127("modulation_par2",Pmodulationpar2);
  1105.     Pmodulationpar3=xml->getpar127("modulation_par3",Pmodulationpar3);
  1106.  
  1107.     Pwaveshaping=xml->getpar127("wave_shaping",Pwaveshaping);
  1108.     Pwaveshapingfunction=xml->getpar127("wave_shaping_function",Pwaveshapingfunction);
  1109.  
  1110.     Pfiltertype=xml->getpar127("filter_type",Pfiltertype);
  1111.     Pfilterpar1=xml->getpar127("filter_par1",Pfilterpar1);
  1112.     Pfilterpar2=xml->getpar127("filter_par2",Pfilterpar2);
  1113.     Pfilterbeforews=xml->getpar127("filter_before_wave_shaping",Pfilterbeforews);
  1114.  
  1115.     Psatype=xml->getpar127("spectrum_adjust_type",Psatype);
  1116.     Psapar=xml->getpar127("spectrum_adjust_par",Psapar);
  1117.  
  1118.     Prand=xml->getpar127("rand",Prand);
  1119.     Pamprandtype=xml->getpar127("amp_rand_type",Pamprandtype);
  1120.     Pamprandpower=xml->getpar127("amp_rand_power",Pamprandpower);
  1121.  
  1122.     Pharmonicshift=xml->getpar("harmonic_shift",Pharmonicshift,-64,64);
  1123.     Pharmonicshiftfirst=xml->getparbool("harmonic_shift_first",Pharmonicshiftfirst);
  1124.  
  1125.     Padaptiveharmonics=xml->getpar("adaptive_harmonics",Padaptiveharmonics,0,127);
  1126.     Padaptiveharmonicsbasefreq=xml->getpar("adaptive_harmonics_base_frequency",Padaptiveharmonicsbasefreq,0,255);
  1127.     Padaptiveharmonicspower=xml->getpar("adaptive_harmonics_power",Padaptiveharmonicspower,0,200);
  1128.  
  1129.  
  1130.     if (xml->enterbranch("HARMONICS")){
  1131.     Phmag[0]=64;Phphase[0]=64;
  1132.     for (int n=0;n<MAX_AD_HARMONICS;n++){
  1133.         if (xml->enterbranch("HARMONIC",n+1)==0) continue;
  1134.         Phmag[n]=xml->getpar127("mag",64);
  1135.         Phphase[n]=xml->getpar127("phase",64);
  1136.         xml->exitbranch();
  1137.     };
  1138.      xml->exitbranch();
  1139.     };
  1140.     
  1141.     if (Pcurrentbasefunc!=0) changebasefunction();
  1142.     
  1143.     
  1144.     if (xml->enterbranch("BASE_FUNCTION")){
  1145.         for (int i=1;i<OSCIL_SIZE/2;i++){
  1146.         if (xml->enterbranch("BF_HARMONIC",i)){
  1147.             basefuncFFTfreqs.c[i]=xml->getparreal("cos",0.0);
  1148.             basefuncFFTfreqs.s[i]=xml->getparreal("sin",0.0);
  1149.             xml->exitbranch();
  1150.         };
  1151.  
  1152.  
  1153.         };
  1154.     xml->exitbranch();
  1155.  
  1156.     REALTYPE max=0.0;
  1157.  
  1158.     basefuncFFTfreqs.c[0]=0.0;
  1159.     for (int i=0;i<OSCIL_SIZE/2;i++) {
  1160.         if (max<fabs(basefuncFFTfreqs.c[i])) max=fabs(basefuncFFTfreqs.c[i]);
  1161.         if (max<fabs(basefuncFFTfreqs.s[i])) max=fabs(basefuncFFTfreqs.s[i]);
  1162.     };
  1163.     if (max<0.00000001) max=1.0;
  1164.  
  1165.     for (int i=0;i<OSCIL_SIZE/2;i++) {
  1166.         if (basefuncFFTfreqs.c[i]) basefuncFFTfreqs.c[i]/=max;
  1167.         if (basefuncFFTfreqs.s[i]) basefuncFFTfreqs.s[i]/=max;
  1168.     };
  1169.     };
  1170. };
  1171.  
  1172.  
  1173.  
  1174.